//package com.cj.interceptor;
//
//import com.cj.Dialect;
//import com.cj.MysqlDialect;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Signature;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//
//import java.util.Properties;
//
///**
// * @author cc
// * @date 2025-05-23 10:02
// **/
//@Intercepts({
//        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class,  RowBounds.class, ResultHandler.class})
//})
//public class PageInterceptor implements Interceptor {
//    // MappedStatement对象在参数列表的索引位置
//    private static int mappedstatement_index = 0 ;
//
//    // 用户传入的实参对象在参数列表的索引位置
//    private static int parameterObject_index = 1;
//
//    private static int rowbounds_index = 2;
//
////    private Diale
//    // 数据库方言，，，
//    private MysqlDialect dialect;
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//
//        Object[] queryArgs = invocation.getArgs();
//
//        // 获取MappedStatement对象   ===》 每一个SQL节点是一个MappedStatement
//        MappedStatement ms = (MappedStatement) queryArgs[0];
//
//        // 用户传入的实参对象
//        Object parameter = queryArgs[1];
//
//        // mybatis默认的分页
//        RowBounds rowBounds = (RowBounds) queryArgs[2];
//
//        // 不需要分页，，直接放行
//        if (rowBounds == RowBounds.DEFAULT){
//            return invocation.proceed();
//        }
//
//        // 获取BoundSql对象，===》 sql的配置+ 带占位符的sql语句
//        BoundSql boundSql = ms.getBoundSql(parameter);
//
//
//        // 带？占位符的sql语句
////        StringBuffer bufferSql = new StringBuffer(boundSql.getSql().trim());
//
//        String sql = boundSql.getSql();
//
//
//        // 查询的起始位置
//        int offset = rowBounds.getOffset();
//        // limit值，，查询返回的记录条数
//        int limit = rowBounds.getLimit();
//
//        // 生成分页sql
//        String pageSql = dialect.getPagingSql(sql, offset, limit);
//
//
//        BoundSql newBoundSql = createNewBoundSql(ms, boundSql, pageSql);
//
//        MappedStatement newMs = createMappedStatement(ms, newBoundSql);
//
//
//        queryArgs[0] = newMs;
//        queryArgs[2] = RowBounds.DEFAULT;
//
//
//
//
//
//
//
//        // 拦截到sql，会根据当前sql重新创建一个新的MappedStatement对象，，并更新到参数列表中
//
//
//
//        return null;
//    }
//
//
//
//    private MappedStatement createMappedStatement(MappedStatement ms,BoundSql boundSql){
//        // 为处理后的sql语句，，创建新的BoundSql对象，，，其中会复制原有的BoundSql对象的parameterMappings等集合的信息
//        String newId  = ms.getId()+"_Page";
//        MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), newId, ms.getSqlSource(), ms.getSqlCommandType());
//        builder.resource(ms.getResource())
//                .fetchSize(ms.getFetchSize())
//                .statementType(ms.getStatementType())
//                .keyGenerator(ms.getKeyGenerator())
//                .timeout(ms.getTimeout())
//                .parameterMap(ms.getParameterMap())
//                .resultMaps(ms.getResultMaps())
//                .cache(ms.getCache())
//                .flushCacheRequired(ms.isFlushCacheRequired())
//                .useCache(ms.isUseCache())
//                .resultOrdered(ms.isResultOrdered());
//
//        if (ms.getKeyProperties() != null && ms.getKeyProperties().length != 0) {
//            builder.keyProperty(String.join(",", ms.getKeyProperties()));
//        }
//
//
//        return builder.build();
//
//
//    }
//
//
//    /**
//     * 创建一个 分页的 BoundSql
//     * @param ms
//     * @param boundSql
//     * @param sql
//     * @return
//     */
//    private BoundSql createNewBoundSql(MappedStatement ms,BoundSql boundSql,String sql){
//        BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject());
//        // 把额外的参数也放进去
//        boundSql.getAdditionalParameters().forEach(newBoundSql::setAdditionalParameter);
//        return newBoundSql;
//    }
//
//
//    @Override
//    public Object plugin(Object target) {
//        return Interceptor.super.plugin(target);
//    }
//
//
//    /**
//     * 根据配置文件中的配置，，完成PageInterceptor的初始化
//     * @param properties
//     */
//    @Override
//    public void setProperties(Properties properties) {
//
//        // 查找名称为 “dbName”的配置项
//        String dbName = properties.getProperty("dbName");
//
//
//
//        Interceptor.super.setProperties(properties);
//    }
//}
